package main

import (
	"fmt"
	"strings"
)

func main() {
	s1 := "This is an example of a string"
	// `HasPrefix` 判断字符串 `s1` 是否以 `prefix` 开头：(区分大小写)
	fmt.Println("has Prefix 'This' : ", strings.HasPrefix(s1, "This"))

	// `HasSuffix` 判断字符串 `s1` 是否以 `suffix` 结尾：(区分大小写)
	fmt.Println("has Suffix 'string' : ", strings.HasSuffix(s1, "string"))

	// `Contains` 判断字符串 `s1` 是否包含 `substr`：
	fmt.Println("has Contains 'of' : ", strings.Contains(s1, "of"))
	fmt.Println("has ContainsAny 'OF' : ", strings.ContainsAny(s1, "OF"))

	// `Index` 返回字符串 `str` 在字符串 `s1` 中的索引（`str` 的第一个字符的索引），-1 表示字符串 `s1` 不包含字符串 `str`：
	fmt.Println("Index : ", strings.Index(s1, "i"))
	// `LastIndex` 返回字符串 `str` 在字符串 `s` 中最后出现位置的索引（`str` 的第一个字符的索引），-1 表示字符串 `s` 不包含字符串 `str`：
	fmt.Println("LastIndex : ", strings.LastIndex(s1, "i"))

	// `Replace` 用于将字符串 `str` 中的前 `n` 个字符串 `old` 替换为字符串 `new`，并返回一个新的字符串，如果 `n = -1` 则替换所有字符串 `old` 为字符串 `new`：
	s2 := "Hello, how is it going, Hugo?"
	mg := "HELLO"
	fmt.Println("Replace : ", strings.Replace(s2, "how", mg, -1))
	fmt.Println("Replace : ", strings.ReplaceAll(s2, "g", "G"))

	// `Count` 用于计算字符串 `str` 在字符串 `s` 中出现的非重叠次数：
	var manyG = "gggggggggg"
	fmt.Printf("Number of H's in %s is: %d \n", s2, strings.Count(s2, "H"))

	fmt.Printf("Number of double g's in %s is: %d \n", manyG, strings.Count(manyG, "gg"))

	// `Repeat` 用于重复 `count` 次字符串 `s` 并返回一个新的字符串：
	fmt.Printf("The new repeated string is: %s\n", strings.Repeat("a", 3))

	// 修改字符串大小写
	orig := "Hey, how are you George?"
	fmt.Printf("The original string is: %s \n", orig)
	lower := strings.ToLower(orig)
	fmt.Printf("The lowercase string is: %s\n", lower)
	upper := strings.ToUpper(orig)
	fmt.Printf("The uppercase string is: %s\n", upper)

	// 你可以使用 `strings.TrimSpace(s)` 来剔除字符串开头和结尾的空白符号；
	//如果你想要剔除指定字符，则可以使用 `strings.Trim(s, "cut")` 来将开头和结尾的 `cut` 去除掉。
	//该函数的第二个参数可以包含任何字符，如果你只想剔除开头或者结尾的字符串，则可以使用 `TrimLeft` 或者 `TrimRight` 来实现。
	s3 := " hello "
	fmt.Printf("The original string is: %s  It is: '%s' \n", s3, strings.TrimSpace(s3))
	fmt.Printf("The original string is: %s  It is: '%s' \n", s3, strings.Trim(s3, " "))
	fmt.Printf("The original string is: %s  It is: '%s' \n", s3, strings.TrimLeft(s3, " "))
	fmt.Printf("The original string is: %s  It is: '%s' \n", s3, strings.TrimRight(s3, " "))

	// 4.7.9 分割字符串
	s4 := "hello1, hello2, hello3"
	fmt.Printf("Fields is: %s \n", strings.Fields(s4))
	fmt.Printf("Split is: %s \n", strings.Split(s4, ","))

	//`Join` 用于将元素类型为 string 的 slice 使用分割符号来拼接组成一个字符串：
	stl := []string{"a", "b", "c"}
	fmt.Printf("Join is: %s \n", strings.Join(stl, ","))

	// 4.7.11 从字符串中读取内容
	reader := strings.NewReader(s1)
	for i := 0; i < reader.Len(); i++ {
		rb, _ := reader.ReadByte()
		fmt.Printf("%c", rb)
	}

}
